package logika;

/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy. */
import grafika.Predplatitel;
import grafika.Vydavatel;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/*******************************************************************************
 * Instance třídy Batoh představují batoh nebo také můžeme říci inventář hráče. Sem si ukládáte předměty, které jsi 
 * sebral.
 *
 * @author    Tomáš Koválik
 * @version   1.0
 */
public class Batoh implements Vydavatel
{
    //== Datové atributy (statické i instancí)======================================
    private static final int KAPACITA = 4;
    private Collection<Vec>seznamVeci;

    //== Konstruktory a tovární metody =============================================
    /**
     * Konstruktor vytvoří batoh pro hru.
     */
    public Batoh()
    {
        seznamVeci = new ArrayList<Vec>();  
    }

    //== Nesoukromé metody (instancí i třídy) ======================================
    /**
     * Metoda vkládá věc do batohu.
     * 
     * @param neco - instance třídy Vec.
     * @return true pokud se splní podmínka a vloží se věc do batohu.
     */
    public boolean vlozVec(Vec neco){
        if (seznamVeci.size() < KAPACITA) {
            seznamVeci.add(neco);
            upozorniMeNaZmenu();
            return true;
        }
        else {
            upozorniMeNaZmenu();
            return false;
        }

    }

    /**
     * Odebírání věci z batohu.
     * 
     * @param řetezec vyjadřující název odebírané věci
     */
    public Vec odeberVec (String nazev){
        Vec vec = null;
        for (Vec neco : seznamVeci) {
            if (neco.getNazev().equals(nazev)) {
                vec = neco;
                upozorniMeNaZmenu();
                seznamVeci.remove(vec);
                break;

            }
        }
        upozorniMeNaZmenu();
        return vec;
    }

    /**
     * Metoda zjišťuje zda se nachází daná věc v batohu.
     * 
     * @param nazev, retězec String.
     * @return true, pokud batoh obsahuje vec se stejným názvem jako je parametr.
     */
    public boolean obsahujeVec (String nazev){
        boolean nalezena = false;
        for (Vec neco : seznamVeci) {
            if (neco.getNazev().equals(nazev)) {
                nalezena = true;
                break;
            }
        }
        return nalezena;
    }

    public Collection<Vec> getVeci() {
        return Collections.unmodifiableCollection(seznamVeci);

    }

    /**
     * Vrací celý seznam vecí v batohu.
     */
    public String getSeznamVeci () {
        String veci="";
        if (seznamVeci.isEmpty()) {
            veci = "...zadne u sebe nemas!";
        }
        else {
            for (Vec neco : seznamVeci) {
                veci = veci + neco.getNazev()+ " ";
            }
           
        }
        
        return veci;

    }

    /**
     * Metoda pro nalezení jedné určité věci v batohu(mistnosti).
     * 
     * @param jmeno
     */
    public Vec najdiVecVMistnosti(String jmeno) {
        Vec vec = null;
        for (Vec neco : seznamVeci){
            if (neco.getNazev().equals(jmeno)){
                vec = neco;
                break;
            }
        }
        return vec;
    }

    private List<Predplatitel> predplatitele = new ArrayList<Predplatitel>();

    @Override
    public void zaregistruj(Predplatitel predplatitel) {
        predplatitele.add(predplatitel);
    }

    @Override
    public void odregistruj(Predplatitel predplatitel) {
        predplatitele.remove(predplatitel);
    }

    @Override
    public void upozorniMeNaZmenu() {
        for (Predplatitel predplatitel : predplatitele) {
            predplatitel.refresh();
        }
    }

    
    
}
